//package com.discovery.core.annotation.json;
//
//import org.springframework.core.MethodParameter;
//import org.springframework.http.MediaType;
//import org.springframework.web.context.request.NativeWebRequest;
//import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
//import org.springframework.web.method.support.ModelAndViewContainer;
//
//import javax.servlet.http.HttpServletResponse;
//import java.lang.annotation.Annotation;
//import java.util.Arrays;
//
///**
// * @Author xuebinlu
// * @Date 2018/5/9 14:22
// * @Version 1.0
// * @Description 拦截controller返回到view页面之前的结果集，对json结果集进行处理
// **/
//public class JsonFilterHandler implements HandlerMethodReturnValueHandler {
//    @Override
//    public boolean supportsReturnType(MethodParameter returnType) {
//        // 如果有我们自定义的 JSON 注解 就用我们这个Handler 来处理
//        return returnType.getMethodAnnotation(JSON.class) != null;
//    }
//
//    @Override
//    public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer,
//                                  NativeWebRequest webRequest) throws Exception {
//        // 设置这个就是最终的处理类了，处理完不再去找下一个类进行处理
//        mavContainer.setRequestHandled(true);
//
//        // 获得注解并执行filter方法 最后返回
//        HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
//        Annotation[] annos = returnType.getMethodAnnotations();
//        JsonFilterSerializer jsonSerializer = new JsonFilterSerializer();
//        Arrays.asList(annos).forEach(a -> { // 解析注解，设置过滤条件
//            if (a instanceof JSON) {
//                jsonSerializer.filter(((JSON) a));
//            }else if (a instanceof JSONS) { // 使用多重注解时，实际返回的是 @Repeatable(JSONS.class) 内指定的 @JSONS 注解
//                Arrays.asList(((JSONS) a).value()).forEach(jsonSerializer::filter);
//            }
//        });
//        response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
//        String json = jsonSerializer.toJson(returnValue);
//        response.getWriter().write(json);
//    }
//}
